package m_dsp_adv_plan

import (
	"gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"
	"time"
	"wx-api/adx-bid/common"
	"wx-api/adx-bid/config"
)

type DspAdvPlan struct {
	Id            bson.ObjectId      `bson:"_id" json:"id,omitempty"`
	Uqid          string             `bson:"uqid" json:"uqid,omitempty"`
	Code          string             `bson:"code" json:"code,omitempty"`                       //计划id
	AdvId         string             `bson:"advId" json:"advId,omitempty"`                     //所属广告主
	AdvName       string             `bson:"advName" json:"advName,omitempty"`                 //所属广告主
	Name          string             `bson:"name" json:"name,omitempty"`                       //计划名称
	Budget        float64            `bson:"budget" json:"budget,omitempty"`                   //每日预算
	Cost          float64            `bson:"cost" json:"cost,omitempty"`                       //总消耗
	TCost         float64            `bson:"tcost" json:"tcost,omitempty"`                     //今日消耗
	YCost         float64            `bson:"ycost" json:"ycost,omitempty"`                     //昨日消耗
	PmediaRadio   string             `bson:"pmedia_radio" json:"pmedia_radio,omitempty"`       //媒体定向
	PMedia        []DspAdvPlanPMedia `bson:"pmedia" json:"pmedia,omitempty"`                   //媒体定向
	PSys          DspAdvPlanPSys     `bson:"psys" json:"psys,omitempty"`                       //系统定向
	PDmp          DspAdvPlanPDmp     `bson:"pdmp" json:"pdmp,omitempty"`                       //用户定向
	PstaRadio     string             `bson:"psta_radio" json:"psta_radio,omitempty"`           //开始投放时间
	PSta          string             `bson:"psta" json:"psta,omitempty"`                       //开始投放时间
	PEnd          string             `bson:"pend" json:"pend,omitempty"`                       //结束投放时间
	PtmsRadio     string             `bson:"ptms_radio" json:"ptms_radio,omitempty"`           //投放时段
	PTms          DspAdvPlanPtms     `bson:"ptms" json:"ptms,omitempty"`                       //投放时段
	Prty          int                `bson:"prty" json:"prty,omitempty"`                       //付费方式:1cpm
	TracksPv      string             `bson:"tracks_pv" json:"tracks_pv,omitempty"`             //展示监测链接
	TracksClick   string             `bson:"tracks_click" json:"tracks_click,omitempty"`       //点击监测链接
	TracksVdStart string             `bson:"tracks_vd_start" json:"tracks_vd_start,omitempty"` //视频开始播放监测链接
	TracksVdEnd   string             `bson:"tracks_vd_end" json:"tracks_vd_end,omitempty"`     //视频播放完毕监测链接
	TracksDpSc    string             `bson:"tracks_dpsc" json:"tracks_dpsc,omitempty"`         //唤起监测链接
	Msg           string             `bson:"msg" json:"msg,omitempty"`                         //计划状态
	Flag          int                `bson:"flag" json:"flag,omitempty"`                       //1 开启 2 关闭
	Status        int                `bson:"status" json:"status,omitempty"`                   //1 正常 2 删除
	CreateTime    int64              `bson:"create_time" json:"create_time,omitempty"`         //创建时间
	UpdateTime    int64              `bson:"update_time" json:"update_time,omitempty"`         //更新时间
	Version       string             `bson:"version" json:"version,omitempty"`                 //版本号
}

type DspAdvPlanPMedia struct {
	MediaId   string `bson:"media_id" json:"media_id,omitempty"`
	MediaName string `bson:"media_name" json:"media_name,omitempty"`
	AppId     string `bson:"app_id" json:"app_id,omitempty"`
	AppName   string `bson:"app_name" json:"app_name,omitempty"`
	SlotId    string `bson:"slot_id" json:"slot_id,omitempty"`
	SlotName  string `bson:"slot_name" json:"slot_name,omitempty"`
}
type DspAdvPlanPSys struct {
	Sys    string   `bson:"sys" json:"sys,omitempty"`         //ios,android
	AllPkg []string `bson:"all_pkg" json:"all_pkg,omitempty"` //包名白名单
}
type DspAdvPlanPDmp struct {
	Code string `bson:"code" json:"code,omitempty"` //人群包id
}
type DspAdvPlanPtms struct {
	One []bool `bson:"one" json:"one"`
	Two []bool `bson:"two" json:"two"`
	The []bool `bson:"the" json:"the"`
	Fon []bool `bson:"fon" json:"fon"`
	Fiv []bool `bson:"fiv" json:"fiv"`
	Sey []bool `bson:"sey" json:"sey"`
	Sun []bool `bson:"sun" json:"sun"`
}
type DspAdvPlanTrack struct {
	EventType int    `bson:"event_type" json:"event_type,omitempty"` //1展示监测，2点击监测，3视频播放监测，4视频播放完毕，5唤起成功监测
	EventUrl  string `bson:"event_url" json:"event_url,omitempty"`   //监测地址
}

func dbGet() *common.TkMongo {
	return config.MgTableDspAdvPlan
}

func Save(a DspAdvPlan) (string, error) {
	a.Id = bson.NewObjectId()
	tmptime := time.Now().Unix()
	a.CreateTime = tmptime
	a.UpdateTime = tmptime
	a.Flag = 1
	a.Status = 1
	a.Version = config.SysVersion
	err := dbGet().Insert(a)
	return a.Id.Hex(), err
}

// 更新
func Update(a DspAdvPlan) error {
	m := bson.M{
		"name":            a.Name,
		"budget":          a.Budget,
		"pmedia_radio":    a.Budget,
		"pmedia":          a.Budget,
		"psys":            a.PSys,
		"pdmp":            a.PDmp,
		"psta_radio":      a.PstaRadio,
		"psta":            a.PSta,
		"pend":            a.PEnd,
		"ptms_radio":      a.PtmsRadio,
		"ptms":            a.PTms,
		"prty":            a.Prty,
		"tracks_pv":       a.TracksPv,
		"tracks_click":    a.TracksClick,
		"tracks_vd_start": a.TracksVdStart,
		"tracks_vd_end":   a.TracksVdEnd,
		"tracks_dpsc":     a.TracksDpSc,
		"update_time":     time.Now().Unix(),
	}

	return dbGet().Set(bson.M{"_id": a.Id}, m)
}

// 更新状态
func UpdateFalg(id string, flag int) error {
	m := bson.M{
		"flag":        flag,
		"update_time": time.Now().Unix(),
	}

	return dbGet().Set(bson.M{"_id": bson.ObjectIdHex(id)}, m)
}

// 删除
func UpdateDel(id string, status int) error {
	m := bson.M{
		"status":      status,
		"update_time": time.Now().Unix(),
	}

	return dbGet().Set(bson.M{"_id": bson.ObjectIdHex(id)}, m)
}

// 获取所有
func GetAll() []DspAdvPlan {
	list := []DspAdvPlan{}
	_ = dbGet().All(nil, &list)
	return list
}

func GetWAll(a int64) []DspAdvPlan {
	list := []DspAdvPlan{}
	_ = dbGet().All(bson.M{"update_time": bson.M{"$gte": a}}, &list)
	return list
}

// 获取详情
func GetByCode(id string) (*DspAdvPlan, error) {
	a := &DspAdvPlan{}
	err := dbGet().FindOne(bson.M{"_id": bson.ObjectIdHex(id)}, a)
	if err != nil {
		if err == mgo.ErrNotFound {
			return nil, nil
		}
		return nil, err
	}
	return a, nil
}
func GetByCk(id string) (*DspAdvPlan, error) {
	a := &DspAdvPlan{}
	w := bson.M{"_id": bson.ObjectIdHex(id)}
	err := dbGet().FindOne(w, a)
	if err != nil {
		if err == mgo.ErrNotFound {
			return nil, nil
		}
		return nil, err
	}
	return a, nil
}

// 列表，带分页
func List(id, name, adx_uid string, flag, status, pageNum, pageSize int) (*common.PageInfo, error) {
	s := bson.M{}
	if id != "" {
		s["_id"] = bson.ObjectIdHex(id)
	}
	if name != "" {
		s["name"] = bson.M{"$regex": bson.RegEx{name, "i"}}
	}
	if adx_uid != "" {
		s["adx_uid"] = adx_uid
	}
	if flag > 0 {
		s["flag"] = flag
	}
	if status > 0 {
		s["status"] = status
	}
	var list []DspAdvPlan
	return dbGet().FindPageInfo(s, "", pageSize, pageNum, "-update_time", &list)
}
